iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0

裝飾器 (Decorators) 與閉包 (Closures) 是 Python 中蠻重要的概念,特別是在提升程式碼可讀性與模組化方面有極大幫助。

1.裝飾器的概念
裝飾器本質上是一個用來包裝其他函式或方法的函式,能改變或擴展被裝飾的函式功能而不改變其原始程式碼。常見的裝飾器應用範例包括日誌記錄、執行時間計算與權限檢查。使用裝飾器的好處在於,透過簡單的 @裝飾器名稱 語法,可以清晰地為函式增添額外的功能,而不影響其主要邏輯。

撰寫裝飾器時,通常會定義一個函式,該函式內部包含另一個函式(包裝函式),然後回傳這個內部函式來包裝原始函式。這段程式碼中,say_hello 被 my_decorator 包裝,因此在執行時,會先輸出「開始執行...」,然後執行 say_hello 本身,再輸出「執行結束!」:

def my_decorator(func):
    def wrapper():
        print("開始執行...")
        func()
        print("執行結束!")
    return wrapper

@my_decorator
def say_hello():
    print("Hello, world!")

say_hello()

2.閉包的作用
閉包則是一種特殊的函式,它能夠「記住」自己所在的作用域,即使外部作用域的變數或函式已經結束,仍然能夠存取外部函式的變數。閉包的特性使得它在實現工廠模式或函式內部創建專屬於該函式的行為時特別有用。

在這個範例中,即使 outer_func 結束執行,inner_func 仍然「記住」了 msg 的值,因此可以成功印出「Hello Closure!」。閉包通常用於製作特定行為的函式、避免全域變數污染或實現延遲計算等情境:

def outer_func(msg):
    def inner_func():
        print(msg)
    return inner_func

closure = outer_func("Hello Closure!")
closure()  # 輸出:Hello Closure!

裝飾器的優點在於可以用簡單的語法來為函式增添額外功能,這樣我就不需要反覆修改現有的程式碼。這種設計方式讓我感受到裝飾器的「模組化」特性,透過封裝額外的功能,既保持了原始函式的簡潔性,又讓程式結構更易於維護與擴展。我還嘗試研究閉包的運作原理,閉包最令我驚豔的地方在於,它能夠「記住」外部環境的變數,哪怕這些變數在外部作用域已經結束。

那今天就先這樣。/images/emoticon/emoticon29.gif


上一篇
Lambda 函式和高階函式
下一篇
網頁爬蟲與資料處理
系列文
從Python入門到自製遊戲:30天鐵人挑戰之旅26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言